package com.ming.config;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.ParameterResolutionDelegate;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.util.StringUtils;
import org.springframework.web.client.RestTemplate;

import javax.annotation.PostConstruct;

/**
 * @Author:何元才
 * @Desc:
 * @data:2021-04-07 20:48
 */
@EnableConfigurationProperties(WxMsgProperties.class)
@Configuration
@Slf4j
@Data
public class WxMsgAutoConfiguration {

    @Autowired
    private WxMsgProperties wxMsgProperties;

    @Autowired
    private RestTemplate restTemplate;

    /**
     * 存放token
     * 对象的创建过程
     * 类加载 解析 验证 链接
     * 在堆内存分配空间
     * 实例化 让堆中的应用给栈
     * 初始化
     * 被使用
     * 销毁
     */
    private String WX_TOKEN;

    /**
     * spring遵循了这个注解的注解的规范
     * 当bean实例化完成
     * 就会执行这个方法
     */
    @PostConstruct
    public void initToken(){
        getWX_TOKEN();
    }

    /**
     * 主要获取token的
     * 发微信消息
     * 1.拿到token必须在发消息之前
     * 分布式任务调度
     * xxl-job
     */
    @Scheduled(fixedRate = 7100*1000)
    public void getWxToken(){
        //获取token 刷新token 就是发一个get请求
        String tokenUrl = wxMsgProperties.getTokenUrl();
        String authUrl = String.format(tokenUrl, wxMsgProperties.getAppId(), wxMsgProperties.getAppSecret());
        String wxResult = restTemplate.getForObject(authUrl, String.class);
        JSONObject jsonObject = JSON.parseObject(wxResult);
        String accessToken = jsonObject.getString("access_token");
        if (StringUtils.hasText(accessToken)){
            //成功了 我们需要把token保存起来 key要固定 每次需要覆盖
            WX_TOKEN = accessToken;
        }else {
            log.error("获取token失败");
        }
    }
}
